People within a business organization often store their data in a relational database. Data stored in a relational database can be organized into multiple tables having different table names. Each such table can include multiple columns and rows. The columns typically represent some attribute of the data. The rows typically represent entities that possess those attributes. The intersections of the columns and tables are cells that contain values. In a particular row representing a particular entity and in a particular column representing a particular attribute, a particular cell may contain a value of that particular attribute for that particular entity. For example, a column of a table can indicate different statuses of bugs detected during a software development cycle. In the context of software bugs, these statuses might include “open,” “awaiting verification,” “fixed,” etc. Other columns might represent other attributes, such as a comment or a description pertaining to the bugs, or an identity of a software tester who discovered the bug. Different rows of a table can represent records for different bugs discovered during software testing. The cells in a particular row can contain the values of the attributes for a particular bug. Assuming that a particular column represents a status, the cells in those columns might contain numbers that represent the various statuses that a bug can have.
People within a business organization may be interested in knowing how objects tend to flow through different statuses that those objects can possess during their lifetimes. For example, software developers and testers may be interested in knowing how discovered bugs tend to flow from “open” to “awaiting verification” to “fixed” status. Software developers and testers may be interested in knowing, at any given moment in history, and for each status, how many bugs possessed that status. Such information can help these people to address possible inefficiencies in the software development and testing process. People may be interested in knowing about status flows for a variety of different objects. For example, in the context of a product order system, people may be interested in knowing the flow of product orders through statuses such as “shipped,” “in transit,” “lost,” “arrived,” “complete,” etc. Different kinds of objects can have different kinds of statuses at different times. Different kinds of objects therefore can follow different status flows.